/* * Copyright (c) 2011-2014 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.test.core; import org.junit.ComparisonFailure; import org.junit.Test; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; /** * @author <a href="http://tfox.org">Tim Fox</a> */ public class AsyncTestBaseTest extends AsyncTestBase { private ExecutorService executor; public void setUp() throws Exception { super.setUp(); disableThreadChecks(); executor = Executors.newFixedThreadPool(10); } protected void tearDown() throws Exception { executor.shutdownNow(); super.tearDown(); } @Test public void testAssertionFailedFromOtherThread() { executor.execute(() -> { assertEquals("foo", "bar"); testComplete(); }); try { await(); } catch (ComparisonFailure error) { assertTrue(error.getMessage().startsWith("expected:")); } } @Test public void testAssertionFailedFromOtherThreadAwaitBeforeAssertAndTestComplete() { executor.execute(() -> { //Pause to make sure await() is called before assertion and testComplete try { Thread.sleep(1000); } catch (InterruptedException e) { fail(e.getMessage()); } assertEquals("foo", "bar"); testComplete(); }); try { await(); } catch (ComparisonFailure error) { assertTrue(error.getMessage().startsWith("expected:")); } } @Test public void testAssertionFailedFromOtherThreadForgotToCallAwait() throws Exception { executor.execute(() -> { assertEquals("foo", "bar"); testComplete(); }); Thread.sleep(500); try { super.afterAsyncTestBase(); fail("Should throw exception"); } catch (IllegalStateException e) { // OK } finally { // Cancel the error condition clearThrown(); } } @Test public void testAssertionFailedFromMainThread() { try { assertEquals("foo", "bar"); } catch (ComparisonFailure error) { assertTrue(error.getMessage().startsWith("expected:")); } testComplete(); } @Test public void testAssertionPassedFromOtherThread() { executor.execute(() -> { assertEquals("foo", "foo"); testComplete(); }); await(); } @Test public void testAssertionPassedFromMainThread() { assertEquals("foo", "foo"); testComplete(); await(); } @Test public void testTimeout() { long timeout = 5000; long start = System.currentTimeMillis(); try { await(timeout, TimeUnit.MILLISECONDS); } catch (IllegalStateException error) { long now = System.currentTimeMillis(); assertTrue(error.getMessage().startsWith("Timed out in waiting for test complete")); long delay = now - start; assertTrue(delay >= timeout); assertTrue(delay < timeout * 1.5); } } // Commented this test as default timeout is now too large // @Test // public void testTimeoutDefault() { // long start = System.currentTimeMillis(); // try { // await(); // } catch (IllegalStateException error) { // long now = System.currentTimeMillis(); // assertTrue(error.getMessage().startsWith("Timed out in waiting for test complete")); // long delay = now - start; // long defaultTimeout = 10000; // assertTrue(delay >= defaultTimeout); // assertTrue(delay < defaultTimeout * 1.5); // } // } @Test public void testFailFromOtherThread() { String msg = "too many aardvarks!"; executor.execute(() -> { fail(msg); testComplete(); }); try { await(); } catch (AssertionError error) { assertTrue(error.getMessage().equals(msg)); } } @Test public void testSuccessfulCompletion() { executor.execute(() -> { assertEquals("foo", "foo"); assertFalse(false); testComplete(); }); await(); } @Test public void testTestCompleteCalledMultipleTimes() { executor.execute(() -> { assertEquals("foo", "foo"); testComplete(); try { testComplete(); } catch (IllegalStateException e) { //OK } }); await(); } @Test public void testAwaitCalledMultipleTimes() { executor.execute(() -> { assertEquals("foo", "foo"); testComplete(); }); await(); try { await(); } catch (IllegalStateException e) { //OK } } @Test public void testNoAssertionsNoTestComplete() { // Deliberately empty test } @Test public void testNoAssertionsTestComplete() { testComplete(); } @Test public void testAssertionOKTestComplete() { assertEquals("foo", "foo"); testComplete(); } @Test public void testAssertionFailedFromMainThreadWithNoTestComplete() { try { assertEquals("foo", "bar"); } catch (AssertionError e) { // OK testComplete(); try { super.afterAsyncTestBase(); } catch (IllegalStateException e2) { fail("Should not throw exception"); } finally { // Cancel the error condition clearThrown(); } } } @Test public void waitForMultiple() { int toWaitFor = 10; waitFor(10); AtomicInteger cnt = new AtomicInteger(); for (int i = 0; i < toWaitFor; i++) { executor.execute(() -> { cnt.incrementAndGet(); complete(); }); } await(); assertEquals(toWaitFor, cnt.get()); } @Test public void increaseToWait() { int toWaitFor = 10; waitFor(3); complete(); complete(); waitForMore(9); AtomicInteger cnt = new AtomicInteger(); for (int i = 0; i < toWaitFor; i++) { executor.execute(() -> { cnt.incrementAndGet(); complete(); }); } await(); assertEquals(toWaitFor, cnt.get()); } }